package shell.command;

import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

/**
 * Implémentation du contexte d'exécution d'un Shell.
 * 
 * @version 1.0
 */
public final class ShellContextImpl implements ShellContext {
    /**
     * Liste des commandes.
     */
    private Map<String, ShellCommand> commands;

    /**
     * Liste des variables d'environnements.
     */
    private Map<String, Object> environnementVariables;

    /**
     * Constructeur.
     * 
     * @param commands
     *            La liste de commandes
     */
    public ShellContextImpl(final Map<String, ShellCommand> commands) {
	this.commands = commands;
	this.environnementVariables = new TreeMap<String, Object>();
    }

    /**
     * @see shell.command.ShellContext#getCommands().
     */
    public synchronized ShellCommand[] getCommands() {
	/*
	 * Variable de retour
	 */
	ShellCommand[] retour = new ShellCommand[this.commands.size()];

	Iterator<ShellCommand> iterator = this.commands.values().iterator();
	for (int i = 0; iterator.hasNext(); ++i) {
	    retour[i] = (ShellCommand) iterator.next();
	}

	/*
	 * Sortie
	 */
	return retour;
    }

    /**
     * @see shell.command.ShellContext#getVar(String).
     */
    public Object getVar(final String key) {
	return this.environnementVariables.get(key);
    }

    /**
     * @see shell.command.ShellContext#getVarNames().
     */
    public Set<String> getVarNames() {
	return this.environnementVariables.keySet();
    }

    /**
     * @see shell.command.ShellContext#setVar(String, Object).
     */
    public void setVar(final String key, final Object value) {
	this.environnementVariables.put(key, value);
    }

    /**
     * @see shell.command.ShellContext#unsetVar(String).
     */
    public Object unsetVar(final String key) {
	return this.environnementVariables.remove(key);
    }
}
